/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ik.pbs.Manejadores;

/**
 *
 * @author alexis
 */
import com.ik.pbs.Encapsulados.Ubicacion;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class ManejadorUbicacion {

    public static ManejadorUbicacion manager = null;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");
    private SimpleDateFormat shf = new SimpleDateFormat("HH:mm:ss");

    public static ManejadorUbicacion getInstance() {
        if (manager == null) {
            manager = new ManejadorUbicacion();
        }

        return manager;
    }

    public void ManejadorUbicacion() {
    }

        public ArrayList<Ubicacion> getUbicacionesPredefinidas(Connection con) {
        ArrayList<Ubicacion> arregloUbicacion = new ArrayList();

        ResultSet rd = null;
        PreparedStatement state;

        String query = "select * from ubicacion where predefinida=1 order by id";

        try {
            state = con.prepareCall(query);
            rd = state.executeQuery();

            while (rd.next()) {
                Ubicacion Ubicacion = new Ubicacion();
                Ubicacion.setId(rd.getInt("id"));
                Ubicacion.setDescripcion(rd.getString("descripcion"));
                Ubicacion.setDireccion(rd.getString("direccion"));
                Ubicacion.setLatitud(rd.getDouble("latitud"));
                Ubicacion.setLongitud(rd.getDouble("longitud"));
                Ubicacion.setSectores(ManejadorSectores.getInstance().getSector(con, rd.getInt("sectores")));
                Ubicacion.setPredefinida(rd.getBoolean("predefinida"));
                arregloUbicacion.add(Ubicacion);
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Error al tomar las Ubicaciones!", "Error",
                    JOptionPane.WARNING_MESSAGE);
        }

        return arregloUbicacion;
    }
    
    public ArrayList<Ubicacion> getUbicaciones(Connection con) {
        ArrayList<Ubicacion> arregloUbicacion = new ArrayList();

        ResultSet rd = null;
        PreparedStatement state;

        String query = "select * from ubicacion order by id";

        try {
            state = con.prepareCall(query);
            rd = state.executeQuery();

            while (rd.next()) {
                Ubicacion Ubicacion = new Ubicacion();
                Ubicacion.setId(rd.getInt("id"));
                Ubicacion.setDescripcion(rd.getString("descripcion"));
                Ubicacion.setDireccion(rd.getString("direccion"));
                Ubicacion.setLatitud(rd.getDouble("latitud"));
                Ubicacion.setLongitud(rd.getDouble("longitud"));
                Ubicacion.setSectores(ManejadorSectores.getInstance().getSector(con, rd.getInt("sectores")));
                Ubicacion.setPredefinida(rd.getBoolean("predefinida"));
                arregloUbicacion.add(Ubicacion);
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Error al tomar las Ubicaciones!", "Error",
                    JOptionPane.WARNING_MESSAGE);
        }

        return arregloUbicacion;
    }

    public Ubicacion getUbicacion(Connection con, int codigo) {
        Ubicacion Ubicacion = null;

        ResultSet rd = null;
        PreparedStatement state;

        String query = "select * from ubicacion where id = ?";

        try {
            state = con.prepareCall(query);
            state.setInt(1, codigo);
            rd = state.executeQuery();

            while (rd.next()) {

                Ubicacion = new Ubicacion();
                Ubicacion.setId(rd.getInt("id"));
                Ubicacion.setDescripcion(rd.getString("descripcion"));
                Ubicacion.setDireccion(rd.getString("direccion"));
                Ubicacion.setLatitud(rd.getDouble("latitud"));
                Ubicacion.setLongitud(rd.getDouble("longitud"));
                Ubicacion.setSectores(ManejadorSectores.getInstance().getSector(con, rd.getInt("sectores")));
                Ubicacion.setPredefinida(rd.getBoolean("predefinida"));
            }

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }

        return Ubicacion;
    }

    public boolean insertarUbicacion(Connection con, Ubicacion Ubicacion) {
        PreparedStatement state;

        String query = "insert into ubicacion values(?,?,?,?,?,?,?)";
        try {


            state = con.prepareStatement(query);
            state.setInt(1, Ubicacion.getId());
            state.setString(2, Ubicacion.getDescripcion());
            state.setString(3, Ubicacion.getDireccion());
            state.setDouble(4, Ubicacion.getLatitud());
            state.setDouble(5, Ubicacion.getLongitud());
            state.setInt(6, Ubicacion.getSectores().getId());
            state.setBoolean(7, Ubicacion.isPredefinida());


            state.execute();
            return true;
        } catch (SQLException ex) {
            return actualizarDireccion(con, Ubicacion);
        }


    }

    public boolean actualizarDireccion(Connection con, Ubicacion Ubicacion) {
        PreparedStatement state;

        String query = "update Ubicacion set descripcion = ?,direccion = ?,latitud = ?,longitud = ?,sectores = ?,predefinida = ? where id = ?";

        try {
            state = con.prepareStatement(query);
            state.setInt(7, Ubicacion.getId());
            state.setString(1, Ubicacion.getDescripcion());
            state.setString(2, Ubicacion.getDireccion());
            state.setDouble(3, Ubicacion.getLatitud());
            state.setDouble(4, Ubicacion.getLongitud());
            state.setInt(5, Ubicacion.getSectores().getId());
            state.setBoolean(6, Ubicacion.isPredefinida());

            state.execute();
            return true;

        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return false;
        }


    }

    public int getNext(Connection con) {
        try {
            ResultSet rd = null;
            PreparedStatement state;
            String query = "select max(id) as max from ubicacion";

            state = con.prepareStatement(query);
            rd = state.executeQuery();

            if (!rd.next()) {
                return 1;
            } else {
                return (rd.getInt("max") + 1);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
        return 0;
    }
}
